/**
 * @file 用户控制器
 * @version 1.0.0
 * @author qingxue
 * @createDate 2024-04-06 20:00
 * @updateDate 2024-04-06 20:00
 */

const { insertUser, deleteUser, updateUser, getUserByPage, getAllUser, getUser, login, register, getUserPermissionById} = require('@/services/user_service');
const url = require('url');
const { ResponseBody, ErrorMessage } = require('@/utils/response');
const checkPermission = require('@/utils/permission/checkPermission');

module.exports = [
  {
    level: 1,
    controllers: [
      // 删除自己的用户信息，level：1
      {
        url: '/account',
        method: 'delete',
        callback: async (req, res) => {
          try {
            // 获取用户 id
            const id = req['customData']['userId'];
            // 删除用户信息
            const data = await deleteUser(id);
            res.json(ResponseBody.success(data));
          } catch (error) {
            res.json(ResponseBody.error(error.message, error.data));
          }
        }
      },
      // 修改自己的用户信息，level：1
      {
        url: '/account',
        method: 'put',
        callback: async (req, res) => {
          try {
            // 获取用户信息
            const user = req.body;
            user.id = req['customData']['userId']; // 自己的 id 不能修改
            user.permission = req['customData']['level']; // 自己的权限不能修改
            // 更新用户信息
            const data = await updateUser(user);
            res.json(ResponseBody.success(data));
          } catch (error) {
            res.json(ResponseBody.error(error.message, error.data));
          }
        }
      },
      // 根据查询条件查询单个用户信息，level：1
      {
        url: '/user',
        method: 'get',
        callback: async function (req, res) {
          try {
            // 获取查询条件
            const queryData = url.parse(req.url, true).query;
            // 查询用户信息
            const data = await getUser(queryData);
            // 权限等级小于2，无法获取密码
            if (req['customData'].level < 2) {
              data.password = undefined;
            }
            res.json(ResponseBody.success(data));
          } catch (error) {
            res.json(ResponseBody.error(error.message, error.data));
          }
        }
      },
      // 登录，level：1
      {
        url: '/login',
        method: 'post',
        callback: async (req, res) => {
          try {
            // 获取用户名和密码
            const { account, password } = req.body;
            // 登录
            const data = await login(account, password);
            res.json(ResponseBody.success(data));
          } catch (error) {
            res.json(ResponseBody.error(error.message, error.data));
          }
        }
      },
      // 查询用户名是否存在，level：1
      {
        url: '/accountExist',
        method: 'get',
        callback: async (req, res) => {
          try {
            // 获取查询条件
            const queryData = url.parse(req.url, true).query;
            // 查询用户信息
            const data = await getUser({ account: queryData.account });
            res.json(ResponseBody.success(!!data));
          } catch (error) {
            res.json(ResponseBody.error(error.message, error.data));
          }
        }
      },
      // 注册，level：1
      {
        url: '/register',
        method: 'post',
        callback: async (req, res) => {
          try {
            // 获取用户信息
            const user = req.body;
            user.permission = 1; // 新注册用户的权限为1
            // 注册
            const data = await register(user);
            res.json(ResponseBody.success(data));
          } catch (error) {
            res.json(ResponseBody.error(error.message, error.data));
          }
        }
      }
    ]
  },
  {
    level: 2,
    controllers: [
      // 新增用户信息，level：2
      {
        url: '/user',
        method: 'post',
        callback: async (req, res) => {
          try {
            // 权限等级：2
            checkPermission(2, req);
            // 获取用户信息
            const user = req.body;
            // 新增用户的权限不能大于等于自己的权限
            if (user.permission >= req['customData']['level']) {
              user.permission = req['customData']['level'] - 1;
            }
            // 新增用户
            const data = await insertUser(user);
            res.json(ResponseBody.success(data));
          } catch (error) {
            res.json(ResponseBody.error(error.message, error.data));
          }
        }
      },
      // 删除用户信息，level：2
      {
        url: '/user',
        method: 'delete',
        callback: async (req, res) => {
          try {
            // 权限等级：2
            checkPermission(2, req);
            // 获取用户 id
            const { id } = req.body;
            const targetLevel = await getUserPermissionById(id); // 目标用户权限等级
            // 只能删除权限等级小于自己的用户
            if (targetLevel >= req['customData']['level']) {
              throw {
                message: ErrorMessage.PermissionNotAllowedError,
                data: null
              };
            }
            // 删除用户信息
            const data = await deleteUser(id);
            res.json(ResponseBody.success(data));
          } catch (error) {
            res.json(ResponseBody.error(error.message, error.data));
          }
        }
      },
      // 修改用户信息，level：2
      {
        url: '/user',
        method: 'put',
        callback: async (req, res) => {
          try {
            // 权限等级：2
            checkPermission(2, req);
            // 获取用户信息
            const user = req.body;
            const targetLevel = await getUserPermissionById(user.id); // 目标用户权限等级
            // 只能修改权限等级小于自己的用户
            if (targetLevel >= req['customData']['level']) {
              throw {
                message: ErrorMessage.PermissionNotAllowedError,
                data: null
              };
            }
            // 目标用户的权限不能大于等于自己的权限
            if (user.permission >= req['customData']['level']) {
              user.permission = req['customData']['level'] - 1;
            }
            // 更新用户信息
            const data = await updateUser(user);
            res.json(ResponseBody.success(data));
          } catch (error) {
            res.json(ResponseBody.error(error.message, error.data));
          }
        }
      },
      // 分页查询用户信息，level：2
      {
        url: '/userByPage',
        method: 'get',
        callback: async (req, res) => {
          try {
            // 权限等级：2
            checkPermission(2, req);
            // 获取查询条件
            const queryData = url.parse(req.url, true).query;
            const { uname, pageNum, pageSize } = queryData;
            // 查询用户信息
            const data = await getUserByPage(uname, parseInt(pageNum), parseInt(pageSize));
            res.json(ResponseBody.success(data));
          } catch (error) {
            res.json(ResponseBody.error(error.message, error.data));
          }
        }
      },
      // 获取所有用户信息，level：2
      {
        url: '/users',
        method: 'get',
        callback: async (req, res) => {
          try {
            // 权限等级：2
            checkPermission(2, req);
            // 查询用户信息
            const data = await getAllUser();
            res.json(ResponseBody.success(data));
          } catch (error) {
            res.json(ResponseBody.error(error.message, error.data));
          }
        }
      }
    ]
  }
];
